package com.company.ThreadDemo;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import sun.rmi.runtime.Log;

/**
 * 作者：13687
 * 日期：2017/6/4
 * 项目：ThreadPoolsDemo
 * 描述：FutureTask
 * 1. 非阻塞式(非get) 获取执行结果
 * 2. done 回调
 * 主线程不能挂 需要等待callable执行完成
 * 3. 最好是在Android(事件驱动) 中测试
 */
public class CallableDemo3 {
/*	public static void main(String[] args) {
=======

	private static FutureTask<Number> futureTask;

	public static void main(String[] args) {
>>>>>>> 0bd31721c755cc469ec7ce6b5858eade9da2871a
		CountCallable countCallable = new CountCallable();
		// 如果任务被取消 执行该方法会抛出异常
// 这里可以更新UI了
// 是不是意味着我可以不用 handle 也可以玩了呢
		futureTask = new FutureTask<Number>(countCallable) {
			@Override
			protected void done() {
				try {
					// 如果任务被取消 执行该方法会抛出异常
					Number number = futureTask.get();
					// 这里可以更新UI了
					// 是不是意味着我可以不用 handle 也可以玩了呢
					System.out.println("任务结束于" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()) + "  result=" + number.getNum());
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (ExecutionException e) {
					e.printStackTrace();
				} catch (CancellationException e) {
					System.out.println("任务被取消于" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()));
				}
			}
		};
		ExecutorService es = Executors.newFixedThreadPool(2);
		es.execute(futureTask);
	}*/

/** 点击事件
 * 取消 任务
 *  public void cancel(View view) {
		futureTask.cancel(true);
	}*/
	public static class CountCallable implements Callable<Number> {

		@Override
		public Number call() throws Exception {
			Number number = new Number();
			System.out.println("运行在"+Thread.currentThread().getName());
			Thread.sleep(5000);
			number.setNum(10);
			return number;
		}

	}

	static class Number {
		private int num;

		private int getNum() {
			return num;
		}

		private void setNum(int num) {
			this.num = num;
		}
	}
}
